#include "uart.h"

uint8_t TXBuffer[TXBUFFERSIZE];//发送缓存区
uint8_t RXBuffer[RXBUFFERSIZE];//发送缓存区
/**
 * 阻塞发送格式化字符串
 * @param huart
 * @param format
 * @param ...
 */
void Uart_FormatSend_block(UART_HandleTypeDef *huart,const char *format,...){
    va_list args;       //定义一个va_list类型的变量，用来储存单个参数
    va_start(args, format); //使args指向可变参数的第一个参数
    vsprintf((char*)TXBuffer,format,args);  //必须用vprintf等带V的
    va_end(args);       //结束可变参数的获
    HAL_UART_Transmit(huart,TXBuffer,strlen((char*)TXBuffer),TIMEOUT);
}

/**
 * 非阻塞发送格式化字符串
 * @param huart
 * @param format
 * @param ...
 */
void Uart_FormatSend_unblock(UART_HandleTypeDef *huart,const char *format,...){
    va_list args;       //定义一个va_list类型的变量，用来储存单个参数
    va_start(args, format); //使args指向可变参数的第一个参数
    vsprintf((char*)TXBuffer,format,args);  //必须用vprintf等带V的
    va_end(args);       //结束可变参数的获
    if(huart->hdmatx != NULL){
        HAL_UART_Transmit_DMA(huart,TXBuffer,strlen((char*)TXBuffer));
    }else{
        HAL_UART_Transmit_IT(huart,TXBuffer,strlen((char*)TXBuffer));
    }
}

/**
 * 阻塞接受不定长数据
 * @param huart
 * @param RxLen_finally 最终接受到的实际数量
 */
void Uart_ReceiveToBuffer_block(UART_HandleTypeDef *huart,uint16_t *RxLen_finally){
    HAL_UARTEx_ReceiveToIdle(huart,RXBuffer,RXBUFFERSIZE,RxLen_finally,TIMEOUT);
}

/**
 * 非阻塞接受不定长数据
 * @param huart
 */
void Uart_ReceiveToBuffer_unblock(UART_HandleTypeDef *huart){
    if(huart->hdmarx != NULL){
        HAL_UARTEx_ReceiveToIdle_DMA(huart,RXBuffer,RXBUFFERSIZE);
        __HAL_DMA_DISABLE_IT(huart->hdmarx,DMA_IT_HT);
    }else{
        HAL_UARTEx_ReceiveToIdle_IT(huart, RXBuffer, RXBUFFERSIZE);
    }
}

/**
 * 用于编写串口完全接受好不定长的数据后对应的处理函数
 * @param huart
 */
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size){
    if(huart->Instance == USART1){
        LED2_TOGGLE();
    }
    Uart_ReceiveToBuffer_unblock(huart);
}
